package com.ssy.lingxi.settle.accounts.service;

import com.ssy.lingxi.common.model.dto.UserLoginCacheDTO;
import com.ssy.lingxi.common.response.PageData;
import com.ssy.lingxi.common.response.Wrapper;
import com.ssy.lingxi.contract.api.model.vo.request.ContractPageRequest;
import com.ssy.lingxi.dto.request.ApplyAmountDetailSunQueryVO;
import com.ssy.lingxi.dto.request.ApplyAmountDetailTotalSunQueryVO;
import com.ssy.lingxi.dto.request.ApplyAmountSunQueryVO;
import com.ssy.lingxi.dto.response.ApplyAmountDetailSunVO;
import com.ssy.lingxi.dto.response.ApplyAmountDetailTotalSunVO;
import com.ssy.lingxi.dto.response.ApplyAmountSunVO;
import com.ssy.lingxi.order.api.model.vo.request.OrderBuyerSettlePageVO;
import com.ssy.lingxi.settle.accounts.model.bo.InvoiceProveBO;
import com.ssy.lingxi.settle.accounts.model.vo.request.*;
import com.ssy.lingxi.settle.accounts.model.vo.response.*;

import java.util.List;

/**
 * 业务请款单信息接口定义
 * @author Saske
 * @date 2021/12/20
 * @version 2.0.0
 */
public interface IApplyAmountService {

    /**
     * 新增请款单
     * @author Saske
     * @date 2021/12/20
     * @param sysUser saveVo
     * @return 请款单id
     **/
    Wrapper<Void> save(UserLoginCacheDTO sysUser , ApplyAmountSaveVO saveVO);

    /**
     * 更新请款单
     * @param sysUser 登录用户
     * @param updateVO 更新
     * @return 更新结果
     */
    Wrapper<Void> update(UserLoginCacheDTO sysUser , ApplyAmountUpdateVO updateVO);

    /**
     * 根据请款单id删除请款单
     * @param user 登录用户
     * @param id 请款单id
     * @return 删除结果
     */
    Wrapper<Void> delete(UserLoginCacheDTO user, Long id);

    /**
     * 查询请款单详情
     * @param detailApplyAmountVO  请款单详情查询条件
     * @return 请款单详情
     */
    Wrapper<ApplyAmountDetailVO> getInfo(UserLoginCacheDTO sysUser , DetailApplyAmountVO detailApplyAmountVO);

    /**
     * 查询请款单状态列表
     * @return 请款单状态列表
     */
    Wrapper<List<DropdownItem>> findStatusList(UserLoginCacheDTO sysUser);

    /**
     * 采购方提交请款单
     * @author Saske
     * @date 2021/12/23
     * @param sysUser submitVo
     **/
    Wrapper<Void> submit(UserLoginCacheDTO sysUser , ApplyAmountOperationVO submitVo);

    /**
     * 分页查询请款单列表-采购方
     * @param sysUser   用户信息
     * @param queryVO   对账单列表查询条件VO
     * @return 查询结果
     */
    Wrapper<PageData<ApplyAmountPageVO>> pageBuyerApplyAmount(UserLoginCacheDTO sysUser , ApplyAmountQueryVO queryVO);

    /**
     * 分页查询待新增请款单列表-采购方
     * @param sysUser   用户信息
     * @param queryVO   对账单列表查询条件VO
     * @return 查询结果
     */
    Wrapper<PageData<ApplyAmountPageVO>> pageToAddApplyAmount(UserLoginCacheDTO sysUser , ApplyAmountQueryVO queryVO);

    /**
     * 分页查询请款单列表-供应商
     * @param sysUser   用户信息
     * @param queryVO   对账单列表查询条件VO
     * @return 查询结果
     */
    Wrapper<PageData<ApplyAmountPageVO>> pageVendorApplyAmount(UserLoginCacheDTO sysUser , ApplyAmountQueryVO queryVO);

    /**
     * 根据单据类型和单据ids 生成新增对账单行明细
     * @param request 请求条件
     * @return 新增对账单行明细
     */
    Wrapper<List<ApplyAmountRowSaveVO>> generateSaveApplyAmountRows(ApplyAmountRowGenerateVO request);

    /**
     * 根据单据id和单据类型获取可核销请款信息
     * @param queryParameter 查询参数
     * @return 可核销请款信息
     */
    Wrapper<PageData<ApplyAmountRowWriteOffRecordSaveVO>> findCanApplyAmountRows(CanApplyAmountRowQueryParameterVO queryParameter);

    /**
     * 查询请款类型列表-排除物料对账单的
     * @return 查询请款类型列表-排除物料对账单的
     */
    Wrapper<List<DropdownItem>> findTypeList();

    /**
     * 查询明细项数据数据
     * @param sysUser 登录用户
     * @param queryParameter 查询条件 主要是请款单id
     * @return 明细项数据数据
     */
    Wrapper<PageData<ApplyAmountRowDetailVO>> findDetails(UserLoginCacheDTO sysUser, DetailApplyAmountVO queryParameter);

    /**
     * 根据请款单类型查询可请款订单数据
     * @param sysUser 登录用户
     * @param queryParameter 查询条件
     * @return 可请款订单数据
     */
    Wrapper<PageData<ApplyAmountOrderVO>> findApplyAmountRowSourceOrders(UserLoginCacheDTO sysUser, OrderBuyerSettlePageVO queryParameter);

    /**
     * 根据请款单类型查询可请款合同数据
     * @param sysUser 登录用户
     * @param queryParameter 查询条件
     * @return 可请款合同数据
     */
    Wrapper<PageData<ApplyAmountContractVO>> findApplyAmountRowSourceContracts(UserLoginCacheDTO sysUser, ContractPageRequest queryParameter);

    /**
     * 更新对应请款id的请款单
     * @param applyAmountId 请款单id
     * @return 更新结果
     */
    Wrapper<Void> pay(Long applyAmountId);

    /**
     * 添加开票记录
     * @param applyAmountId 请款单id
     * @param invoiceId 开票id
     * @param proofId 开票凭证id
     * @param proveList 开票信息
     * @return 添加结果
     */
    Wrapper<Void> addInvoiceRecord(Long applyAmountId, Long invoiceId, Long proofId, List<InvoiceProveBO> proveList);

    /**
     * 根据查询条件获取合同请款情况(按税率、单据id划分)
     * @param queryVO 查询参数
     * @return 合同请款情况（按税率、单据id划分）
     */
    Wrapper<PageData<ApplyAmountDetailSunVO>> pageContractExecuteDetail(ApplyAmountDetailSunQueryVO queryVO);

    /**
     * 根据查询条件获取合同请款情况
     * @param queryVO 查询参数
     * @return 合同请款情况
     */
    Wrapper<List<ApplyAmountDetailTotalSunVO>> pageContractExecuteDetailSum(ApplyAmountDetailTotalSunQueryVO queryVO);

    /**
     * 合同服务-查询 合同请款情况统计
     * @param queryVO 查询条件
     * @return 合同请款情况统计
     */
    Wrapper<PageData<ApplyAmountSunVO>> pageListForSummaryByParty(ApplyAmountSunQueryVO queryVO);

    /**
     * 合同服务-查询 合同请款付款情况统计
     * @param queryVO 查询条件
     * @return 合同请款情况统计
     */
    Wrapper<List<ApplyAmountSunVO>> listForPaySummaryByParty(ApplyAmountSunQueryVO queryVO);
}
